package com.putong35.common.account;

import android.text.TextUtils;
import android.util.Log;

import com.putong35.common.app.BaseApplication;
import com.putong35.common.app.data.Cache;
import com.putong35.common.httprequest.app.Token;
import com.putong35.common.utils.GsonUtils;


/**
 * 账户的管理类
 *
 * 只支持当个账户 *
 *
 * @Author: PV
 * @E-mail: pengveivei@sina.cn
 * @CreateDate: 2016/7/12 16:36
 * @Version: 1.0.0
 */
public class AccountManager {
    private static final String TAG = AccountManager.class.getSimpleName();

    private static Account mAccount;  // 账户类可以为空， 外界访问这个对象的时候如果是空值， 则说明当前账户没有登录或者登录过期了
    private static AccountManager mAccountManager;

    AccountManager() {
    }

    public static AccountManager getInstance() {
        if (mAccountManager == null) {
            mAccountManager = new AccountManager();
        }
        return mAccountManager;
    }

    /**
     * 获取当前用户对象
     *
     * 对外部提供的接口，获取当前的账户类
     *
     * 如果当前账户过期，或者没有登录，则返回null
     *
     * @return
     */
    public Account getAccount() {
        // 没有登录，或者登录失效
        if (!Token.getInstance().isTokenValid()) {
            Log.w(TAG, "用户还没有登或者token失效了");
            return null;
        }

        // 没有用户数据
        if (mAccount == null) {
            mAccount = createAccountFromSp();
            if (mAccount == null || TextUtils.isEmpty(mAccount.getId())) {
                Log.w(TAG, "用户数据为空，或者uid为空");
                return null;
            }
        }

        // 返回用户数据
        return mAccount;
    }


    /**
     * 退出登录
     * clear cache
     */
    public void clear() {
        Token.getInstance().clear();
        if (getAccount() != null) {
            setAccount(null);
        }
//        JPushInterface.stopPush(MyApplication.getAppContext());
        // TODO clean more        e.g image cache/ thumbnail
    }

    /**
     * 初始化，从SP中读取
     */
    private Account createAccountFromSp() {
        String acctJson = Cache.getCurrentAccount(BaseApplication.getAppContext());
        if (TextUtils.isEmpty(acctJson)) {
            return null;
        }
        return GsonUtils.string2Object(acctJson, Account.class);
    }

    /**
     * 序列化，将数据存储到磁盘（SP）
     */
    public void saveAccountToSp() {
        String acctJson = GsonUtils.object2String(this);
        Cache.setCurrentAccount(BaseApplication.getAppContext(), acctJson);
    }


    /**
     * 设置当前账户信息
     * 从服务器获取用户信息后调用此方法保存用户信息
     *
     * @param account
     */
    public void setAccount(Account account) {
        mAccount = account;
        String acctJson = "";
        if (mAccount != null) {
            acctJson = GsonUtils.object2String(mAccount);
        }
        Cache.setCurrentAccount(BaseApplication.getAppContext(), acctJson);
    }

}
